Добро пожаловать в Engee
Индексы и модификация массивов
Цель: Научиться использовать индексы, чтобы получать из массивов Engee целые строки или столбцы и модифицировать их значения.
Вводное видео
Транскрипция видео
В инженерных и научных вычислениях, массивы, матрицы и векторы используются очень часто. Поэтому для программирования в Engee вам необходимо понимать, как работать с массивами.
Самым простым действием является обращение к элементам массива. Оно ещё называется индексацией. Индексация – это механизм, при помощи которого вы достаёте значения из массивов или модифицируете их. Позиция элемента внутри массива называется его индексом. Индексы элементов вам пригодятся для извлечения значений из массива. Например, если вам нужен элемент под номером три вектора x, вы можете набрать x(3). Если вы знаете положение элемента, вы также можете изменить его значение. В этом примере мы меняем значение элемента с индексом "3" на единицу.
Вы также можете извлечь диапазон значений, используя начальный и конечный индексы элементов, разделенные двоеточием.
Если вы хотите извлечь элемент из матрицы, нужно указать уже два индекса. Первый индекс – это номер строки, а второй - номер столбца.
Довольно часто бывает, что из матрицы нужно извлечь целую строку или целый столбец. Когда вы используете двоеточие, само по себе, в качестве индекса, оно означает – "весь диапазон", то есть целая строка или целый столбец. Вот, например, как извлечь все столбцы из первой строки. А в данном случае мы извлекаем все строки из третьего столбца.
С помощью индексации можно сделать ещё много интересного, но пока запомните, что синтаксис для индексирования элементов матриц – "строка-запятая-столбец". А элементы вектора достаточно индексировать одним числом.
Упражнение 1: Выбираем значения из массивов по индексам
using CSV, DataFrames;
cd(@__DIR__);
data = Matrix(CSV.read("datafile.csv", DataFrame, header=0))
display(data)
Задача 1
Вы можете получить значения из матрицы при помощи индексов, но нужно учитывать порядок размерностей: строка, столбец.
y = A[5,7]
Эта команда возвращает тот элемент, который хранится на пересечении 5-й строки и 7-го столбца матрицы A и присваивает его значение переменной y.
x, содержащую значение по следующим координатам: 6-я строка, 3-й столбец исходной переменной data.
Подсказка
Передайте значения 6 и 3 в data, окружив их квадратными скобками.
Решение
x = data[6,3]
Задача 2
Слово end можно использовать тогда, когда нужно получить последний элемент строки или столбца массива.
y = A[end,2]
end получите значение на пересечении последней строки и 3-го столбца матрицы в переменной data. Значение присвойте переменной y.
Подсказка
Передайте end и 3 в качестве аргументов переменной data.
Решение
y = data[end,3]
Задача 3
Кстати, слово end можно использовать и в арифметических выражениях. Например, можно написать:
y = A[end-1,end-2]
z со значением, взятым из переменной data на пересечении предпоследней (end-1) строки и 3-го столбца.
Подсказка
Передайте аргументы end-1 и 3 при индексации переменной data.
Решение
z = data[end-1,3]
Задача 4*
Можно индексировать матрицы при помощи одной переменной (одномерного индекса). Тогда Julia использует такой порядок индексации: счетчик элементов будет последовательно отсчитывать их вдоль столбцов, начиная с первого, пока не дойдет до элемента с заданным индексом. Например, следующий код вернет значение 6.
A = [5 6;
7 8]
A[3]
Для закрепления сперва попробуйте, пользуясь лишь одним индексом, получить восьмой элемент переменной data.
Теперь второй шаг. В качестве индекса можно использовать не только числа, но и переменные. Попробуйте задать переменную y, равную 8, и с ее помощью получить восьмой элемент матрицы data.
Упражнение 2: Выбираем сразу несколько элементов массива
Задача 1
Оператор двоеточие (:) можно использовать в качестве индекса массива. Тогда он обозначает, что нужно вернуть "все элементы по некоторой размерности массива". Так что код
x = A[:,1]
создаст нам вектор-столбец, в котором содержатся все элементы из первого столбца матрицы A.
density, содержащий 2-й столбец матрицы data.
Подсказка
Выберите столбец элементов из матрицы, использовав двоеточие (:) в качестве первого индекса. Эта операция вернёт нам все элементы на пересечении каждой строки с нужным нам столбцом.
В качестве второго индекса используйте 2. Это будет означать "взять второй столбец".
Написание переменных в Julia учитывает регистр, так что density – не то же самое, что Density.
Решение
density = data[:,2]
Задача 2
Оператор : можно использовать для задания диапазона индексов. Вот, например, код, который возвращает матрицу, состоящую из первой, второй и третьей строк некоторой матрицы A.
x = A[1:3,:]
volumes, содержащую последние два столбца матрицы data. Размеры матрицы data можно посмотреть в окне Переменные или же после ячейки с кодом, где она была создана.
Подсказка
Первым аргументом должно быть двоеточие (:).
Кстати, есть и другие способы получения последних столбцов матрицы data. Например, попробуйте end-1:end или 3:4.
Решение
volumes = data[:,3:4]
Задача 3
Для индексации векторов достаточно одного элемента. Например, x = v[3] вернет нам третий элемент вектора v, без учета того, является ли v вектором-строкой или столбцом.
p, содержащую 6-й элемент вектора density.
Подсказка
Передайте в переменную density число 6 в квадратных скобках.
Решение
p = density[6]
Задача 4
Выбрать элементы в некотором интервале индексов можно при помощи обычного диапазона. Например, x = v[3:end] вернет нам подмножество вектора v, содержащего все элементы от третьего до последнего.
p, содержащий со 2-го по 5-й элементы переменной density.
Подсказка
Передайте диапазон 2:5 в переменную density.
Решение
p = density[2:5]
Задача 5*
Индексацию не обязательно производить при помощи непрерывных рядов. Например, чтобы извлечь первый, третий и шестой элементы переменной density, можно в качестве индекса передать список [1 3 6] (у вас будет два уровня вложенных квадратных скобок: density[[idx]]).
Упражнение 3: Изменяем данные в массивах
Задача 1
Итак, оператор : можно использовать, чтобы выделить целый столбец массива.
v2, содержащий последний столбец массива data.v2 = data[:,end]
Подсказка
Используйте двоеточие и слово end чтобы получить последний столбец массива data.
Решение
v2 = data[:,end]
Задача 2
Чтобы изменить значение некоторых элементов массива, можно отобрать их из общего списка при помощи индексации, составив список ссылок на эти элементы, а затем присвоить выбранным элементам новые значения.
A[2] = 11
Эта команда присваивает второму элементу матрицы A новое значение: 11.
v2, имеющий значение 3.517, на 0.5.
Подсказка
Передайте индекс 1 переменной v2 и присвойте выбранному элементу значение 0.5.
Решение
v2[1] = 0.5
Задача 3
Обратите внимание: мы изменили значение в векторе v2, но не в матрице data. Разумеется, при помощи индексирования можно легко изменять значения элементов и в матрицах тоже. Вот как сейчас выглядит матрица data:
data на 0.5.
Подсказка
Индекс нужного элемента матрицы включает два значения. К примеру, получить второй элемент последнего столбца вы можете при помощи такой индексации: A[2,end].
Решение
data[1,end] = 0.5
Задача 4*
Можно взять элементы по одному индексу и присвоить их значения элементам с другими индексами. Например, такой код позволяет подставить значение элемента x[2] на место элемента x[1]:
x[1] = x[2]
Попробуйте таким же образом заменить первый столбец матрицы data на второй столбец той же матрицы data.
Больше о работе с массивами в Julia можно прочитать в документации.